/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package controller;

import java.util.logging.Level;

import javax.swing.JOptionPane;

import model.ModelListaArticulo;
import model.ModelVentaArticulo;
import model.exception.ArticuloNoEcontradoException;
import model.exception.ArticuloSinStockException;
import tiendagui.internal.JDialogListaArticulo;
import tiendagui.internal.factura.JInternalFrameFactura;
import utils.exceptions.VentaRechazadaException;
import controller.utils.ControllerTable;
import entities.vo.ArticuloVO;
import entities.vo.FacturaVO;
import entities.vo.ItemFacturaVO;
import entities.vo.ItemTablaVO;

/**
 *
 * @author Jhonny
 */
public class ControllerVentaArticulo extends Controller implements ControllerTable{

	private JDialogListaArticulo listaArticulos;
    private boolean trabajando;
    
    public ControllerVentaArticulo(JInternalFrameFactura dialog, ModelVentaArticulo model) {
        super(dialog,model);
    }

    @Override
    public void initComponentView() throws Exception {
        JInternalFrameFactura factura = (JInternalFrameFactura) dialog;
        ModelVentaArticulo modelFactura = (ModelVentaArticulo) model;
        
        factura.setNumeroFactura(modelFactura.getNumeroFactura());
        factura.setFecha(modelFactura.getFecha());
        changeTipoFactura();
        factura.setContadoSelect(true);
        clearDatosVentana();
    }

    private void clearDatosVentana() {
    	deleteTable(((JInternalFrameFactura) dialog).getTabla());
    	((JInternalFrameFactura) dialog).setNombre("");
    	((JInternalFrameFactura) dialog).setApellido("");
    	((JInternalFrameFactura) dialog).setDomicilio("");
    	((JInternalFrameFactura) dialog).setTelefono("");
    	((JInternalFrameFactura) dialog).setCuit("");
    	((JInternalFrameFactura) dialog).setIngresosBrutos("");
    	((JInternalFrameFactura) dialog).setRemit("");
		
	}

	@Override
    public ItemTablaVO getArticulo() {
    	ItemTablaVO item=null;
    	ArticuloVO articuloVO=null;
    	getListaArticulos().setVisible(true);
    	articuloVO = (ArticuloVO) getListaArticulos().getArticulo();
    	if(articuloVO!=null){
	    	if(articuloVO.getStock()<=0){
	    		JOptionPane.showMessageDialog(null, "El articulo no tiene suficiente stock.");
	    	}else{    		
	    		//articuloVO = ((ModelVentaArticulo) model).actualizarStock(((ArticuloVO)item).getReferencia(),1);
	    		if(articuloVO!=null){
		    		item = new ItemFacturaVO();
		    		((ItemFacturaVO)item).setArticulo(articuloVO);
		    		((ItemFacturaVO)item).setCant(1);
		    		((ItemFacturaVO)item).setPrecioCobrado(articuloVO.getPrecioUnitario());
	    		}
	    	}
	    	//calcularTotal();
    	}
    	return item;
    }

    public JDialogListaArticulo getListaArticulos() {
        if(listaArticulos==null){            
            listaArticulos = new JDialogListaArticulo(null, true,new ModelListaArticulo());
        }
        return listaArticulos;
    }
    @Override
    public ArticuloVO getArticulo(Integer referencia) {
        return model.getArticulo(referencia);
    }
    public void generarFactura() throws VentaRechazadaException {
    	FacturaVO factura = obtenerFactura();
    	if(factura!=null && factura.getItems()!=null &&factura.getItems().size()>0){
	        ((ModelVentaArticulo) model).generarFactura(factura);
	        cerrar();
    	}else{
    		throw new VentaRechazadaException("No se puede generar la factura, se deben agregar articulos.");
    	}
    }
    public void calcularTotal() throws ArticuloNoEcontradoException, ArticuloSinStockException {
    	validarStock();
    	FacturaVO factura = obtenerFactura();
    	Float total = 0F;
    	Float iva = 0F;
    	Float subTotal = 0F;
    	verificarPrecioOferta();
        total=((ModelVentaArticulo) model).calcularTotal(factura);
        ((JInternalFrameFactura)dialog).setTotal(total);
        
        if(((JInternalFrameFactura)dialog).getTipo().equalsIgnoreCase("A")){
        	subTotal = total/1.21F;        	
        }
        iva = total - subTotal;
        ((JInternalFrameFactura)dialog).setIva(iva);
        ((JInternalFrameFactura)dialog).setSubTotal(subTotal);
    	
    }

	private void validarStock() throws ArticuloNoEcontradoException, ArticuloSinStockException {		
		int rowSelect = ((JInternalFrameFactura)dialog).getSelectedRow();
		if(rowSelect>=0){
			Integer cantidad=0;
			ItemFacturaVO item=null;
			ArticuloVO articulo = null;
			cantidad = (Integer) ((JInternalFrameFactura)dialog).getCellRow(rowSelect, 0);
			item =  (ItemFacturaVO) ((JInternalFrameFactura)dialog).getCellRow(rowSelect, 1);
			if(item!=null){
				articulo = item.getArticulo();
				if(articulo!=null){
					if(cantidad>articulo.getStock()){
						item.setCant(1);
						((JInternalFrameFactura)dialog).removeRow(rowSelect);
						((JInternalFrameFactura)dialog).insertRow(rowSelect, item.toVector());
						throw new ArticuloSinStockException("La cantidad del articulo "+articulo.getReferencia()+" supera el stock disponible. ");
					}
				}else{
					throw new ArticuloNoEcontradoException("El articulo  no se pudo encontrar en el sistema");				
				}
			}else{
				throw new ArticuloNoEcontradoException("Error en la lectura de la tabla.");
			}
		}
	}

	private void verificarPrecioOferta() {
		int rowSelect = ((JInternalFrameFactura)dialog).getSelectedRow();
		ItemFacturaVO item=null;
		if(rowSelect>=0 ){
			float precio=0;
			item =  (ItemFacturaVO) ((JInternalFrameFactura)dialog).getCellRow(rowSelect, 1);
			if((Boolean)((JInternalFrameFactura)dialog).getCellRow(rowSelect, 3)){
				precio = item.getArticulo().getPrecioOferta();
			}else{
				precio = item.getArticulo().getPrecioUnitario();
			}
			item.setPrecioCobrado(precio);
			((JInternalFrameFactura)dialog).removeRow(rowSelect);
			((JInternalFrameFactura)dialog).insertRow(rowSelect, item.toVector());
		}

	}

	private FacturaVO obtenerFactura() {
		FacturaVO factura = new FacturaVO();
		factura.setCondicionPago(((JInternalFrameFactura)dialog).getCondicionPago());
		factura.setCuit(((JInternalFrameFactura)dialog).getCuit());
		factura.setFecha(((JInternalFrameFactura)dialog).getFecha());
		factura.setIngresosBrutos(((JInternalFrameFactura)dialog).getIngresosBrutos());
		factura.setNroFactura(((JInternalFrameFactura)dialog).getNroFactura());
		factura.setRemito(((JInternalFrameFactura)dialog).getRemito());		
		factura.setTipoIva(((JInternalFrameFactura)dialog).getTipoIva());
		factura.setTipo(((JInternalFrameFactura)dialog).getTipo());
		factura.setItems(((JInternalFrameFactura)dialog).getItemsTabla());
		return factura;
	}

	public void changeTipoFactura() throws ArticuloNoEcontradoException, ArticuloSinStockException {
		String tipo = ((JInternalFrameFactura)dialog).getTipo();
		if(tipo.equalsIgnoreCase("A")){
			((JInternalFrameFactura)dialog).setResponsableInscriptoEnable(true);
			((JInternalFrameFactura)dialog).setResponsableInscriptoSelect(true);
			((JInternalFrameFactura)dialog).setExcentoEnable(false);
			((JInternalFrameFactura)dialog).setNoResponsableEnable(false);
			((JInternalFrameFactura)dialog).setConsumidorFinalEnable(false);	
		}else if(tipo.equalsIgnoreCase("B")||tipo.equalsIgnoreCase("C")){
			((JInternalFrameFactura)dialog).setResponsableInscriptoEnable(false);
			((JInternalFrameFactura)dialog).setResponsableInscriptoSelect(false);
			((JInternalFrameFactura)dialog).setExcentoEnable(true);
			((JInternalFrameFactura)dialog).setExcentoSelect(false);
			((JInternalFrameFactura)dialog).setNoResponsableEnable(true);
			((JInternalFrameFactura)dialog).setNoResponsableSelect(false);
			((JInternalFrameFactura)dialog).setConsumidorFinalEnable(true);
			((JInternalFrameFactura)dialog).setConsumidorFinalSelect(true);
		}
		calcularTotal();
	}

	@Override
	public void postAgregar() {
		try {
			calcularTotal();
		} catch (Exception e) {
			logger.log(Level.SEVERE, e.getLocalizedMessage(), e.fillInStackTrace());
		}
	}

	@Override
	public void postEliminar(){
		try {
			calcularTotal();
		} catch (Exception e) {
			logger.log(Level.SEVERE, e.getLocalizedMessage(), e.fillInStackTrace());
		} 
	}

	public boolean trabajando() {
		return trabajando;
	}

	public void setTrabajando(boolean b) {
		trabajando = b;		
	}
}
